﻿#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//int main()
//{
//	unsigned long pulArray[] = { 6,7,8,9,10 };
//	unsigned long* pulPtr;
//	pulPtr = pulArray;
//	*(pulPtr + 3) += 3;
//	printf("%d,%d\n", *pulPtr, *(pulPtr + 3));
//	return 0;
//}

//#include <stdio.h>
//#include<string.h>
//int main()
//{
//    char arr[] = "abcdef";
//    size_t sz = strlen(arr);
//    char* p = &arr[sz - 1];
//    int i = 0;
//    for (i = sz - 1; i >= 0; i--)
//    {
//        printf("%c", *p);
//        p--;
//    }
//}

//#include<stdio.h>
//#include<string.h>
//int main()
//{
//    char arr[10000] = { 0 };
//    scanf("%s", arr);
//    int sz = sizeof(arr) / sizeof(arr[0]) - 1;
//    int i = 0;
//    for (i = sz - 1; i >= 0; i--)
//    {
//        printf("%c", arr[i]);
//    }
//}

//#include<string.h>
//#include<stdio.h>
////将一个字符串str的内容颠倒过来，并输出。
//int main()
//{
//    char arr[10000] = { 0 };
//    //字符串中可能有空格，不能直接用scanf
//    //scanf遇到空格就结束读取了
//    //用gets函数来读取
//    gets(arr);
//    int sz = strlen(arr);// //求出字符串长度，中间的空格也会被算进去
//    int i = 0;
//    for (i = sz - 1; i >= 0; i--)
//    {
//        printf("%c", arr[i]);
//    }
//    return 0;
//}

////实现一个函数，可以左旋字符串中的k个字符。
////ABCD左旋一个字符得到BCDA
////ABCD左旋两个字符得到CDAB
//#include<stdio.h>
//#include<string.h>
//void left(char arr[], int n,size_t sz)
//{
//	int temp = 0, i = 0;
//	while(i<n)
//	{
//		arr[i] = arr[i + n];
//		printf("%c", arr[i]);
//		i++;
//	}
//}
//int main()
//{
//	char arr[] = "ABCD";
//	int n = 0;
//	size_t sz = strlen(arr);
//	scanf("%d", &n);//左旋个数
//	left(arr, n, sz);
//	return 0;
//}

//实现一个函数，可以左旋字符串中的k个字符。
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
//#include<stdio.h>
//#include<string.h>
//void left(char arr[], int n, size_t sz)
//{
//	int temp = 0, i = 0;
//	for (i = 0; i < n; i++)
//	{
//		char temp = arr[0];
//		for (int j = 0; j < sz - 1; j++)
//		{
//			arr[j] = arr[j + 1];
//		}
//		arr[sz - 1] = temp;
//	}
//	printf("%s\n", arr);
//}
//int main()
//{
//	char arr[] = "ABCD";
//	printf("%s\n", arr);
//	int n = 0;
//	size_t sz = strlen(arr);
//	scanf("%d", &n);//左旋个数
//	left(arr, n, sz);
//	return 0;
//}

//#include<stdio.h>
//#include<string.h>
//void left(char * p, int n, size_t sz)
//{
//	int temp = 0, i = 0;
//	for (i = 0; i < n; i++)
//	{
//		char temp = *p ;
//		for (int j = 0; j < sz - 1; j++)
//		{
//			*(p + j) = *(p + j + 1);
//		}
//		*(p+sz-1) = temp;
//	}
//}
//int main()
//{
//	char arr[] = "ABCD";
//	printf("%s\n", arr);
//	int n = 0;
//	size_t sz = strlen(arr);
//	printf("请输入左旋个数：\n");
//	scanf("%d", &n);//左旋个数
//	left(arr, n, sz);
//	printf("%s\n", arr);
//	return 0;
//}
//


//模拟实现库函数strlen
//#include<stdio.h>
//#include<assert.h>
//int my_strlen(const char* p)//防止*p（p所指向的内容）发生改变
//{
//	int count = 0;
//	assert(p != NULL);//assert 断言---判断是否为空指针，（）内为真才不报警告
//	//在这里判断指针是否有效
//	while (*p)
//	{
//		count++;
//		p++;
//	}
//	return count;
//}
//int main()
//{
//	char arr[] = "abcdefg";
//	int len = my_strlen(arr);
//	printf("%d\n", len);
//	return 0;
//}

//输出奇数
//#include<stdio.h>
//void move_data(int* p)
//{
//	for (int i = 0; i < 10; i++)
//	{
//		if (*p % 2 == 1)
//			printf("%d ", *p);
//		p++;
//	}
//	
//}
//int main()
//{
//	int arr[10];
//	int i = 0;
//	printf("请输入10个整数：\n");
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	move_data(arr);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a[10];
//	int b[10] = { 0 };
//	int i = 0;
//	int* p = b;
//	printf("请输入10个整数：\n");
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &a[i]);
//	}
//	for (i = 0; i < 10; i++)
//	{
//		if (a[i] % 2 == 1)
//		{
//			*p = a[i];
//			p++;
//		}
//	}
//	for (i = 0; i < 10; i++)
//	{
//		if (a[i] % 2 == 0)
//		{
//			*p = a[i];
//			p++;
//		}
//	}
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", b[i]);
//	}
//	return 0;
//}

/*
思路：
1. 给定两个下标left和right，left放在数组的起始位置，right放在数组中最后一个元素的位置
2. 循环进行一下操作
 a. 如果left和right表示的区间[left, right]有效，进行b，否则结束循环
 b. left从前往后找，找到一个偶数后停止
 c. right从后往前找，找到一个奇数后停止
 d. 如果left和right都找到了对应的数据，则交换，继续a，
*/
//#include<stdio.h>
//void swap_arr(int arr[], int sz)
//{
//	int left = 0;
//	int right = sz - 1;
//	int tmp = 0;
//	while (left < right)
//	{
//		// 从前往后，找到一个偶数，找到后停止
//		while ((left < right) && (arr[left] % 2 == 1))
//		{
//			left++;
//		}
//
//		// 从后往前找，找一个奇数，找到后停止
//		while ((left < right) && (arr[right] % 2 == 0))
//		{
//			right--;
//		}
//
//		// 如果偶数和奇数都找到，交换这两个数据的位置
//		// 然后继续找，直到两个指针相遇
//		if (left < right)
//		{
//			tmp = arr[left];
//			arr[left] = arr[right];
//			arr[right] = tmp;
//		}
//	}
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	
//	int i = 0;
//	int arr[] = { 1,2,3,4,5,6,7,8 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	swap_arr(arr, sz);
//	return 0;
//}


////const修饰变量
//#include<stdio.h>
//int main()
//{
//	const int a = 10;//const修饰之后，a变成常变量，其值不可以改变
//	//a = 20;//err
//	return 0;
//}

//const修饰指针变量
//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int b = 20;
//	//int const* p = &a;
//	const int * p = &a;
//	//当const在*左边时，*p（p所指向的内容）不可以改变，而p指针变量可以改变
//	//*p = 20;//err
//	p = &b;
//	printf("%p\n", &a);
//	printf("%p\n", &b);
//	printf("%p\n", p);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int* const p = &a;
//	//当const在*右边时，*p（p所指向的内容）可以改变，而p指针变量不可以改变
//	*p = 100;
//	//p = &b;//err
//	printf("%p\n", &a);
//	printf("%p\n", &b);
//	printf("%p\n", p);
//	printf("%d\n", a);
//	printf("%d\n", b);
//	printf("%d\n", *p);
//	return 0;
//}


//指针运算
//指针+-整数
//#include<stdio.h>
//int main()
//{
//	int arr[6] = { 1,2,3,4,5,6 };
//	//       下标：0 1 2 3 4 5 
//	//             p   p+2
//	char brr[] = "abcdef";
//	int* pa = arr;//数组名代表数组首元素地址
//	char* pb = brr;
//	printf("%d\n", *(pa + 2));
//	printf("%c\n", *(pb + 2));
//	return 0;
//}

//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6 };
//	char brr[] = "abcdef";
//	int sz1 = sizeof(arr) / sizeof(arr[0]);
//	//int sz2 = sizeof(brr) / sizeof(brr[0]) - 1;//使用sizeof计算字符数组时，包括'\0'
//	size_t sz2 = strlen(brr);//计算字符串长度，不包括'\0',头文件string.h
// size_t是无符号整型
//	int* pa = &arr[sz1 - 1];
//	char* pb = &brr[sz2 - 1];
//	printf("%d\n", *(pa - 2));
//	printf("%c\n", *(pb - 2));
//	return 0;
//}

//指针-指针
//计算结果的绝对值为两个指针之间的元素个数
//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,7 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p1 = arr;
//	int* p2 = &arr[sz - 1];
//	printf("%d\n", p2 - p1);
//	printf("%d\n", *p2 - *p1);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,7 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p1 = arr;
//	int* p2 = &arr[sz - 1];
//	//printf("%d\n", p2 + p1);//err  指针+指针无实际意义
//	printf("%d\n", *p2 + *p1);
//	return 0;
//}


////指针-指针的应用
//#include<stdio.h>
//size_t my_strlen(char* p)
//{
//	char* start = p;
//	char* end = p;
//	while (*end != '\0')
//	{
//		end++;
//	}
//	return end - start;
//}
//int main()
//{
//	char arr[] = "abcdefgh";
//	size_t sz = my_strlen(arr);
//	//printf("%zd\n", sz);//返回类型为size-t，使用%d打印
//	return 0;
//}

//写⼀个函数，交换两个整型变量的值
//return 只可以返回一个值
#include<stdio.h>
void swap(int* c, int* d)
{
	int temp = 0;
	temp = *c;
	*c = *d;
	*d = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	int* pa = &a;
	int* pb = &b;
	printf("交换前：a=%d,b=%d\n", a, b);
	swap(pa, pb);
	printf("交换后：a=%d,b=%d\n", a, b);
	return 0;
}